home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / programr / wtj007.zip / BLOOM.ZIP / SURVEYX.C < prev    next >
Text File  |  1992-07-24  |  19KB  |  708 lines

  1. /*
  2.  * SURVEYX.C  WM_CTLCOLOR DEMONSTRATION
  3.  *         APPLICATION WITH OWNER DRAW BUTTONS
  4.  *         SIMULATES DATABASE INPUT, ANALYSIS,
  5.  *         AND PRESENTATION
  6.  *
  7.  *         This portion simulates the
  8.  *         data entry from a look alike form
  9.  */
  10.  
  11. #include "survdemo.h"
  12. #include <stdlib.h>
  13. #include "odbutton.h" /* Our own Owner Draw Button
  14.                          header information */
  15.  
  16.  
  17. HANDLE hInst = 0;      /* Handle to current
  18.                        instance of application */
  19. HWND hDlgSurvey = 0;   /* Handle to modeless
  20.                                     dialog box */
  21.  
  22.        /* Handles to child dialog boxes */
  23. HWND hDlgGraph = 0;
  24. HWND hDlgStatistics = 0;
  25.  
  26. HANDLE hInst ;
  27. char   szAppName [] = "Survey" ;
  28. char   szCaption [] = "Survey (Dialog Box)" ;
  29.  
  30.  /* DEFINE OWNER-DRAW BUTTON BORDER THICKNESS */
  31. #define THICKNESS   3
  32.  
  33. /* Global GDI Objects Used In All Modules */
  34.  
  35. HICON hIconSurvey;
  36. HICON hIconStats;
  37. HICON hIconGraph;
  38.  
  39. HBITMAP hBitmapBkGndSurvey;
  40. HBITMAP hBitmapLogo;
  41.  
  42. HFONT   hFontTimes;
  43. HFONT   hFontTimesSmall;
  44. HFONT   hFontTimesVerySmall;
  45. HFONT   hFontTimesButton;
  46.  
  47. HPEN    hDarkGrayPen;
  48.  
  49. HBRUSH hBrushRed;
  50. HBRUSH hBrushLightRed;
  51. HBRUSH hBrushYellow;
  52. HBRUSH hBrushDarkYellow;
  53. HBRUSH hBrushGreen;
  54. HBRUSH hBrushCyan;
  55. HBRUSH hBrushBlue;
  56. HBRUSH hBrushLightBlue;
  57. HBRUSH hBrushMagenta;
  58. HBRUSH hBrushLightMagenta;
  59. HBRUSH hBrushDarkGreen;
  60. HBRUSH hBrushIconSurvey;
  61. HBRUSH hBrushBkGndSurvey;
  62.  
  63.  
  64.  
  65.  
  66. #define BLACK  RGB(0, 0, 0)
  67. #define RED    RGB(255,0,0)
  68. #define LIGHTRED    RGB(255,130,126)
  69. #define YELLOW RGB(255,255,0)
  70. #define DARKYELLOW RGB(192,192,0)
  71. #define GREEN  RGB(0, 255, 0)
  72. #define CYAN   RGB(0, 255, 255)
  73. #define YELLOWGREEN   RGB(193,255,125)
  74. #define LIGHTGREEN  RGB(130, 255, 130)
  75. #define DARKGREEN  RGB(0, 125, 0)
  76. #define BLUE  RGB(0, 0, 255)
  77. #define BLUEGREEN  RGB(0, 125, 255)
  78. #define LIGHTBLUE  RGB(98, 193, 255)
  79. #define BLACK  RGB(0, 0, 0)
  80. #define MAGENTA  RGB(255, 0, 255)
  81. #define LIGHTMAGENTA RGB(255,90,255)
  82. #define DARKMAGENTA  RGB(223, 0, 172)
  83. #define WHITE  RGB(255, 255, 255)
  84. #define DARKGRAY    RGB(128,128,128)
  85.  
  86. /* Data to Load Survey - Normally Obtained From
  87.                                       Database */
  88.  
  89. int fakedataSurvey[] =
  90.   {
  91.   1,0,0,0,0,
  92.   0,1,0,0,0,
  93.   1,0,0,0,0,
  94.   0,0,1,0,0,
  95.   0,1,0,0,0,
  96.   0,1,0,0,0,
  97.   1,0,0,0,0,
  98.   0,1,0,0,0,
  99.   1,0,0,0,0
  100.   };
  101.  
  102. int NumFakedata = sizeof( fakedataSurvey ) /
  103.                           sizeof( char* );
  104.  
  105. int idsSurvey[] =
  106.   {
  107.   IDRB_HL1,
  108.   IDRB_HL2,
  109.   IDRB_HL3,
  110.   IDRB_HL4,
  111.   IDRB_HL5,
  112.   IDRB_MWSA6,
  113.   IDRB_MWA7,
  114.   IDRB_MWNA8,
  115.   IDRB_MWD9,
  116.   IDRB_MWSD10,
  117.   IDRB_QCSA11,
  118.   IDRB_QCA12,
  119.   IDRB_QCNA13,
  120.   IDRB_QCD14,
  121.   IDRB_QCSD15,
  122.   IDRB_HISA16,
  123.   IDRB_HIA17,
  124.   IDRB_HINA18,
  125.   IDRB_HID19,
  126.   IDRB_HISD20,
  127.   IDRB_LUSA21,
  128.   IDRB_LUA22,
  129.   IDRB_LUNA23,
  130.   IDRB_LUD24,
  131.   IDRB_LUSD25,
  132.   IDRB_NISA26,
  133.   IDRB_NIA27,
  134.   IDRB_NINA28,
  135.   IDRB_NID29,
  136.   IDRB_NISD30,
  137.   IDRB_HUSA31,
  138.   IDRB_HUA32,
  139.   IDRB_HUNA33,
  140.   IDRB_HUD34,
  141.   IDRB_HUSD35,
  142.   IDRB_HBSA36,
  143.   IDRB_HBA37,
  144.   IDRB_HBNA38,
  145.   IDRB_HBD39,
  146.   IDRB_HBSD40,
  147.   IDRB_OVSA41,
  148.   IDRB_OVA42,
  149.   IDRB_OVNA43,
  150.   IDRB_OVD44,
  151.   IDRB_OVSD45
  152.   };
  153.  
  154. int NumFakedataSurvey = 45;
  155.  
  156.  
  157.  
  158.  
  159. /************************************************/
  160. int PASCAL WinMain( HANDLE hInstance,
  161.           HANDLE hPrevInstance, LPSTR lpszCmdLine,
  162.           int nCmdShow )
  163. {
  164.     HMENU hMenu;
  165.     MSG msg;
  166.  
  167.     if ( hPrevInstance )
  168.     {
  169.     MessageBox( NULL, "Survey is already running.",
  170.               "Windows Survey",
  171.               MB_OK | MB_ICONINFORMATION );
  172.         return 1;
  173.     }
  174.  
  175.     hInst = hInstance;
  176.  
  177.     /* Create modeless dialog box. */
  178.  
  179.     hDlgSurvey = CreateDialog( hInstance,
  180.                szAppName,NULL,
  181.                MakeProcInstance( SurveyDlgProc,
  182.                hInstance) );
  183.  
  184.     hIconSurvey = LoadIcon (hInstance,"SurveyIcon");
  185.     hIconStats = LoadIcon (hInstance,"StatsIcon");
  186.     hIconGraph = LoadIcon (hInstance,"GraphIcon");
  187.  
  188.  
  189.     /* Add item to system menu. */
  190.     hMenu = GetSystemMenu( hDlgSurvey, FALSE );
  191.     AppendMenu( hMenu, MF_SEPARATOR, 0, NULL );
  192.     AppendMenu( hMenu, MF_BYCOMMAND | MF_STRING,
  193.                     IDM_ABOUT, "&About..." );
  194.  
  195.     while ( GetMessage( &msg, NULL, 0, 0 ) )
  196.     {
  197.         if ( hDlgSurvey == 0 ||
  198.               !IsDialogMessage( hDlgSurvey, &msg))
  199.           {
  200.           if (hDlgStatistics == 0 ||
  201.             !IsDialogMessage(hDlgStatistics,&msg))
  202.             {
  203.             if (hDlgGraph == 0 ||
  204.                  !IsDialogMessage(hDlgGraph,&msg))
  205.             {
  206.               {
  207.               TranslateMessage( &msg );
  208.               DispatchMessage( &msg );
  209.               }
  210.             }
  211.             }
  212.           }
  213.     }
  214.     return ( msg.wParam );
  215. }
  216.  
  217.  
  218. /******************************************************************************/
  219. BOOL FAR PASCAL SurveyDlgProc( HWND hDlg,
  220.                    unsigned iMessage, WORD wParam,
  221.                    LONG lParam )
  222.   {
  223.   static FARPROC lpfnAboutDlgProc;
  224.   static FARPROC lpfnStatisticsDlgProc;
  225.  
  226. /* ID of DlgBox's child control */
  227.   WORD controlID;
  228.   int type;
  229.   int i,id;
  230.   DWORD check;
  231.   RECT rect;
  232.   LPRECT lpRect;
  233.  
  234.   /* ID of Dialog box'x controls */
  235.   /* which extra work must be done on */
  236.  
  237.   static HWND hCtrlBitmap;
  238.  
  239.   PAINTSTRUCT ps;    /* used in painting icon */
  240.   RECT rcWindow;
  241.   HBRUSH hBrush;
  242.   HDC hdc;
  243.  
  244.  
  245.   switch ( iMessage )
  246.     {
  247.     case WM_INITDIALOG:
  248.  
  249.       lpfnStatisticsDlgProc = MakeProcInstance
  250.               (StatisticsDlgProc, hInst );
  251.  
  252. /*  Get handle to Controls which will be
  253.       processed outside of normal dialog
  254.                                   operations. */
  255.       hCtrlBitmap = GetDlgItem(hDlg,IDSTAT_BITMAP);
  256.  
  257.  
  258.           /* Initialize GDI Objects */
  259.  
  260.       hBitmapBkGndSurvey  = LoadBitmap(hInst,
  261.                              "BkGndYel");
  262.       hBitmapLogo  = LoadBitmap(hInst,
  263.                                 "SurveyLogo");
  264.       hBrushBkGndSurvey = CreatePatternBrush
  265.                              (hBitmapBkGndSurvey);
  266.  
  267.       hFontTimes = CreateFont(16,6,0,0, 800,FALSE,
  268.         FALSE,FALSE,OEM_CHARSET,
  269.         OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,
  270.         PROOF_QUALITY,VARIABLE_PITCH|FF_ROMAN,
  271.                       "Roman");
  272.      hFontTimesSmall = CreateFont(12,6,0,0, 400,
  273.         TRUE,FALSE,FALSE,OEM_CHARSET,
  274.         OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,
  275.         PROOF_QUALITY,VARIABLE_PITCH|FF_ROMAN,
  276.         "Roman");
  277.      hFontTimesVerySmall = CreateFont(12,6,0,0, 400,
  278.         FALSE,FALSE,FALSE,OEM_CHARSET,
  279.         OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,
  280.         PROOF_QUALITY,VARIABLE_PITCH|FF_ROMAN,
  281.         "Roman");
  282.       hFontTimesButton = CreateFont(20,6,0,0, 800,
  283.         FALSE,FALSE,FALSE,OEM_CHARSET,
  284.         OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,
  285.         PROOF_QUALITY,VARIABLE_PITCH|FF_ROMAN,
  286.         "Roman");
  287.  
  288.       hBrushRed = CreateSolidBrush(RED);
  289.       hBrushLightRed = CreateSolidBrush(LIGHTRED);
  290.       hBrushYellow = CreateSolidBrush(YELLOW);
  291.       hBrushDarkYellow = CreateSolidBrush
  292.                                       (DARKYELLOW);
  293.       hBrushGreen = CreateSolidBrush(GREEN);
  294.       hBrushCyan = CreateSolidBrush(CYAN);
  295.       hBrushBlue = CreateSolidBrush(BLUE);
  296.       hBrushLightBlue = CreateSolidBrush(LIGHTBLUE);
  297.       hBrushMagenta = CreateSolidBrush(MAGENTA);
  298.       hBrushLightMagenta = CreateSolidBrush
  299.                                     (LIGHTMAGENTA);
  300.       hBrushDarkGreen = CreateSolidBrush(DARKGREEN);
  301.  
  302.       hDarkGrayPen = CreatePen(PS_SOLID, 1,DARKGRAY);
  303.  
  304.  
  305.  
  306.       // FILL EXAMPLE SPREADSHEET BOXES
  307.  
  308.       SetDlgItemText(hDlg,IDSTAT_RECNO403,
  309.                                      (LPSTR)"24");
  310.  
  311.       for (i=0;i<NumFakedataSurvey;i++)
  312.         CheckDlgButton(hDlg,idsSurvey[i],
  313.                               fakedataSurvey[i]);
  314.         break;
  315.  
  316.     case WM_PAINT:
  317.       if (IsIconic(hDlg))
  318.         {
  319.         PaintIcon(hDlg,hIconSurvey);
  320.         break;
  321.         }
  322.       else
  323.       /* Logo Bitmap must be painted here  */
  324.         PaintBitmap ( hCtrlBitmap,hBitmapLogo);
  325.         break;
  326.  
  327.         /* Owner Draw Button Handler */
  328.     case WM_DRAWITEM:
  329.       id = ((LPDRAWITEMSTRUCT)lParam)->CtlID;
  330.       switch (id)
  331.         {
  332.         case IDPB_FIRST501: case IDPB_LAST504:
  333.           SetODButton((LPDRAWITEMSTRUCT)lParam,0,0,
  334.                                DT_CENTER,THICKNESS);
  335.           return TRUE;
  336.  
  337.         case IDPB_PREV502: case IDPB_NEXT503:
  338.           SetODButton((LPDRAWITEMSTRUCT)lParam,0,0,
  339.                                DT_CENTER,THICKNESS);
  340.           return TRUE;
  341.  
  342.         case IDPB_STATISTICS:
  343.           SetODButton((LPDRAWITEMSTRUCT)lParam,0,0,
  344.                                DT_CENTER,THICKNESS);
  345.           return TRUE;
  346.  
  347.         case IDPB_NEW505:
  348.           SetODButton((LPDRAWITEMSTRUCT)lParam,0,0,
  349.                               DT_CENTER,THICKNESS);
  350.           return TRUE;
  351.  
  352.         case IDPB_SAVE506:
  353.           SetODButton((LPDRAWITEMSTRUCT)lParam,0,0,
  354.                                DT_CENTER,THICKNESS);
  355.           return TRUE;
  356.  
  357.         case IDPB_QUIT507:
  358.           SetODButton((LPDRAWITEMSTRUCT)lParam,0,0,
  359.                                DT_CENTER,THICKNESS);
  360.           return TRUE;
  361.  
  362.         default:
  363.           break;
  364.         }
  365.       break;
  366.  
  367. /* Parse WM_CTLCOLOR Messages and Return  Objects */
  368.  
  369.     case WM_CTLCOLOR:
  370.       type = HIWORD (lParam);
  371.       controlID = GetWindowWord (LOWORD (lParam),
  372.                                   GWW_ID) ;
  373.       switch (type)
  374.         {
  375.         case CTLCOLOR_DLG:
  376.           return ((DWORD) hBrushBkGndSurvey);
  377.  
  378.         case CTLCOLOR_BTN:
  379.           SetBkMode(wParam, TRANSPARENT);
  380.           SetBkColor(wParam, GetSysColor
  381.                                  (COLOR_WINDOW));
  382.           switch(controlID)
  383.             {
  384.             case IDPB_STATISTICS:
  385.               SetTextColor(wParam, BLUE);
  386.               SelectObject(wParam,hDarkGrayPen);
  387.               SelectObject(wParam,hFontTimesButton);
  388.               return ((DWORD) hBrushGreen);
  389.  
  390.             case IDPB_FIRST501: case IDPB_LAST504:
  391.               SetTextColor(wParam, BLUE);
  392.               SelectObject(wParam,hDarkGrayPen);
  393.               SelectObject(wParam,hFontTimesButton);
  394.               return ((DWORD) hBrushMagenta);
  395.  
  396.             case IDPB_NEXT503: case IDPB_PREV502:
  397.               SetTextColor(wParam, RED);
  398.               SelectObject(wParam,hDarkGrayPen);
  399.               SelectObject(wParam,hFontTimesButton);
  400.               return ((DWORD) hBrushYellow);
  401.  
  402.             case IDPB_SAVE506:
  403.               SetTextColor(wParam, BLUE);
  404.               SelectObject(wParam,hDarkGrayPen);
  405.               SelectObject(wParam,hFontTimesButton);
  406.               return ((DWORD) hBrushCyan);
  407.  
  408.             case IDPB_NEW505:
  409.               SetTextColor(wParam, BLUE);
  410.               SelectObject(wParam,hDarkGrayPen);
  411.               SelectObject(wParam,hFontTimesButton);
  412.               return ((DWORD) hBrushYellow);
  413.  
  414.             case IDPB_QUIT507:
  415.               SetTextColor(wParam, BLUE);
  416.               SelectObject(wParam,hDarkGrayPen);
  417.               SelectObject(wParam,hFontTimesButton);
  418.               return ((DWORD) hBrushRed);
  419.  
  420.             case IDRB_HL1: case IDRB_HL2:
  421.             case IDRB_HL3: case IDRB_HL4:
  422.             case IDRB_HL5: case IDRB_MWSA6:
  423.             case IDRB_MWA7: case IDRB_MWNA8:
  424.             case IDRB_MWD9: case IDRB_MWSD10:
  425.             case IDRB_QCSA11: case IDRB_QCA12:
  426.             case IDRB_QCNA13: case IDRB_QCD14:
  427.             case IDRB_QCSD15: case IDRB_HISA16:
  428.             case IDRB_HIA17: case IDRB_HINA18:
  429.             case IDRB_HID19: case IDRB_HISD20:
  430.             case IDRB_LUSA21: case IDRB_LUA22:
  431.             case IDRB_LUNA23: case IDRB_LUD24:
  432.             case IDRB_LUSD25: case IDRB_NISA26:
  433.             case IDRB_NIA27: case IDRB_NINA28:
  434.             case IDRB_NID29: case IDRB_NISD30:
  435.             case IDRB_HUSA31: case IDRB_HUA32:
  436.             case IDRB_HUNA33: case IDRB_HUD34:
  437.             case IDRB_HUSD35: case IDRB_HBSA36:
  438.             case IDRB_HBA37: case IDRB_HBNA38:
  439.             case IDRB_HBD39: case IDRB_HBSD40:
  440.             case IDRB_OVSA41: case IDRB_OVA42:
  441.             case IDRB_OVNA43: case IDRB_OVD44:
  442.             case IDRB_OVSD45:
  443.  
  444.               check = SendDlgItemMessage(hDlg,
  445.                       controlID, BM_GETCHECK, 0, 0);
  446.               if (check)
  447.            /* We can change colors here */
  448.                  SetTextColor(wParam, RED);
  449.               else
  450.                  SetTextColor(wParam, DARKGREEN);
  451.               return ((DWORD) hBrushBkGndSurvey);
  452.  
  453.  
  454.             default:
  455.               SetTextColor(wParam, GREEN);
  456.               SelectObject(wParam,hFontTimesButton);
  457.               return ((DWORD) hBrushBkGndSurvey);
  458.             }
  459.  
  460.         case CTLCOLOR_STATIC:
  461.           SetBkMode(wParam, TRANSPARENT);
  462.           switch(controlID)
  463.             {
  464.             case IDSTAT_401:
  465.               SetTextColor(wParam,RED);
  466.               SelectObject(wParam,hFontTimes);
  467.               return ((DWORD) hBrushBkGndSurvey);
  468.  
  469.             case IDSTAT_402:
  470.               SetTextColor(wParam,BLUE);
  471.               SelectObject(wParam,hFontTimesSmall);
  472.               return ((DWORD) hBrushBkGndSurvey);
  473.  
  474.             case IDSTAT_HEADING:
  475.               SetTextColor(wParam,RED);
  476.               SelectObject(wParam,hFontTimes);
  477.               return ((DWORD) hBrushBkGndSurvey);
  478.  
  479.             case IDSTAT_TEXTBLUE:
  480.               SetTextColor(wParam,BLUE);
  481.               SelectObject(wParam,hFontTimesSmall);
  482.               return ((DWORD) hBrushBkGndSurvey);
  483.  
  484.             case IDSTAT_TEXTGREEN:
  485.               SetTextColor(wParam,BLACK);
  486.               SelectObject(wParam,hFontTimesSmall);
  487.               return ((DWORD) hBrushBkGndSurvey);
  488.  
  489.             case IDSTAT_TEXTMAGENTA:
  490.               SetTextColor(wParam,DARKMAGENTA);
  491.               SelectObject(wParam,hFontTimesSmall);
  492.               return ((DWORD) hBrushBkGndSurvey);
  493.           
  494.         case IDSTAT_TEXTMAGENTASMALL:
  495.               SetTextColor(wParam,DARKMAGENTA);
  496.               SelectObject(wParam,hFontTimesVerySmall);
  497.               return ((DWORD) hBrushBkGndSurvey);
  498.  
  499.             case IDSTAT_CATAGORY:
  500.               SetTextColor(wParam,DARKMAGENTA);
  501.               SelectObject(wParam,hFontTimes);
  502.               return ((DWORD) hBrushBkGndSurvey);
  503.  
  504.  
  505.             default:
  506.               SetTextColor(wParam, CYAN);
  507.               SetBkMode(wParam, TRANSPARENT);
  508.               return ((DWORD) hBrushBkGndSurvey);
  509.             }
  510.  
  511.         default:
  512.  
  513.           SetTextColor(wParam, BLUE);
  514.           SetBkMode(wParam, TRANSPARENT);
  515.           return ((DWORD) hBrushBkGndSurvey);
  516.         }
  517.  
  518.  
  519.     case WM_COMMAND:
  520.       switch ( wParam )
  521.         {
  522.         case IDPB_NEW505:
  523.           // No routine here - fake button
  524.           break;
  525.  
  526.         case IDPB_SAVE506:
  527.           // No routine here - fake button
  528.           break;
  529.  
  530.         case IDPB_FIRST501:
  531.           // No routine here - fake button
  532.           break;
  533.  
  534.  
  535.         case IDPB_LAST504:
  536.           // No routine here - fake button
  537.           break;
  538.  
  539.  
  540.         case IDPB_NEXT503:
  541.           // No routine here - fake button
  542.           break;
  543.  
  544.         case IDPB_PREV502:
  545.           // No routine here - fake button
  546.           break;
  547.  
  548.         case IDPB_STATISTICS:
  549.           if (hDlgStatistics) /* if Statistics
  550.                                  already created */
  551.             break;
  552.           hDlgStatistics = CreateDialog (hInst,
  553.                             "Statistics", NULL,
  554.                             lpfnStatisticsDlgProc);
  555.           MakeStats(hDlgStatistics);
  556.             break;
  557.  
  558.         case IDPB_QUIT507:
  559.             SendMessage( hDlg, WM_CLOSE, 0, 0L );
  560.             break;
  561.  
  562.         default:
  563.             return FALSE;
  564.           }
  565.       break;
  566.  
  567.     case WM_SYSCOMMAND:
  568.       switch ( wParam )
  569.         {
  570.         case IDM_ABOUT:
  571.  
  572.           lpfnAboutDlgProc = MakeProcInstance
  573.                            ( AboutDlgProc, hInst );
  574.           DialogBox( hInst, "About", hDlg,
  575.                                 lpfnAboutDlgProc );
  576.           FreeProcInstance( lpfnAboutDlgProc );
  577.           break;
  578.  
  579.         default:
  580.           return FALSE;
  581.         }
  582.       break;
  583.  
  584.  
  585. /* We have to delete all our GDI objects here  */
  586.  
  587.     case WM_CLOSE:
  588.  
  589.       DeleteObject(hDarkGrayPen);
  590.       DeleteObject(hFontTimes);
  591.       DeleteObject(hFontTimesSmall);
  592.       DeleteObject(hFontTimesVerySmall);
  593.       DeleteObject(hFontTimesButton);
  594.       DeleteObject(hBrushRed);
  595.       DeleteObject(hBrushLightRed);
  596.       DeleteObject(hBrushYellow);
  597.       DeleteObject(hBrushDarkYellow);
  598.       DeleteObject(hBrushGreen);
  599.       DeleteObject(hBrushCyan);
  600.       DeleteObject(hBrushDarkGreen);
  601.       DeleteObject(hBrushBlue);
  602.       DeleteObject(hBrushLightBlue);
  603.       DeleteObject(hBrushMagenta);
  604.       DeleteObject(hBrushLightMagenta);
  605.       DeleteObject(hBrushBkGndSurvey);
  606.       DeleteObject(hBitmapBkGndSurvey);
  607.       DeleteObject(hBitmapLogo);
  608.  
  609.       /* Send a WM_DESTROY message. */
  610.       DestroyWindow( hDlg );
  611.       hDlgSurvey = 0;
  612.       break;
  613.  
  614.     case WM_DESTROY:
  615.  
  616.             PostQuitMessage( 0 );
  617.             break;
  618.  
  619.     default:
  620.       return FALSE;
  621.     }
  622.     return FALSE;
  623.   }
  624.  
  625.  
  626. /**************************************************/
  627. BOOL FAR PASCAL AboutDlgProc( HWND hDlg,
  628.                    unsigned iMessage, WORD wParam,
  629.                    LONG lParam )
  630.   {
  631.   switch ( iMessage )
  632.     {
  633.     case WM_INITDIALOG:
  634.       return TRUE;
  635.  
  636.     case WM_COMMAND:
  637.  
  638.       if ( wParam == IDOK || wParam == IDCANCEL )
  639.         {
  640.         EndDialog( hDlg, TRUE );
  641.         return TRUE;
  642.         }
  643.       break;
  644.     }
  645.   return FALSE;
  646.   }
  647.  
  648. BOOL PaintBitmap (HWND hCtrl,HBITMAP hBM)
  649.   {
  650.   HDC     hDCBits, hDC;
  651.   BITMAP  bm;
  652.   BOOL    ok;
  653.   RECT    rect;
  654.   WORD   controlID;
  655.  
  656.   controlID = GetWindowWord(hCtrl, GWW_ID);
  657.   GetClientRect(hCtrl, &rect);
  658.   UpdateWindow(hCtrl);
  659.   hDC = GetDC(hCtrl);
  660.  
  661.   GetClientRect(hCtrl,&rect);
  662.   hDCBits = CreateCompatibleDC(hDC);
  663.   GetObject(hBM, sizeof(BITMAP), (LPSTR)&bm);
  664.   SelectObject(hDCBits, hBM);
  665.   ok = StretchBlt(hDC, 0, 0, rect.right,
  666.              rect.bottom, hDCBits, 0, 0, bm.bmWidth,
  667.              bm.bmHeight, SRCCOPY);
  668.   DeleteDC(hDCBits);
  669.   ReleaseDC(hCtrl, hDC);
  670.   return(ok);
  671.   }
  672.  
  673.  
  674. void PaintIcon (HWND hDLG, HICON hIcon)
  675.   {
  676.   HDC   hdc;
  677.   RECT rect;
  678.   PAINTSTRUCT ps;
  679.   RECT rcWindow;
  680.   HBRUSH hBrushIcon;
  681.  
  682.   if (IsIconic(hDLG))
  683.     {
  684. /* get device context and size of display area */
  685.         hdc = BeginPaint(hDLG, &ps);
  686.         GetClientRect(hDLG, &rcWindow);
  687.  
  688.         /* make background = desktop */
  689.         hBrushIcon = CreateSolidBrush(GetSysColor
  690.                                 (COLOR_BACKGROUND));
  691.         FillRect(hdc, &rcWindow, hBrushIcon);
  692.         DeleteObject(hBrushIcon);
  693.  
  694. /* center icon in client window area. rcWindow.top
  695.    and .left  will always be zero, so we leave them
  696.    out of the calculation. */
  697.  
  698.  
  699.         DrawIcon (hdc,
  700.           (rcWindow.right  - GetSystemMetrics
  701.             (SM_CXICON))/2,(rcWindow.bottom -
  702.              GetSystemMetrics(SM_CYICON))/2,
  703.              hIcon);
  704.         EndPaint(hDLG, &ps);
  705.     }
  706.   }
  707.  
  708.